package com.yang.miniostudy01.utils;

import java.lang.annotation.Retention;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;

public class TimeConverter {

    // 使用自定义格式化模式
    private static final DateTimeFormatter isoFormatter = new DateTimeFormatterBuilder()
            .append(DateTimeFormatter.ISO_LOCAL_DATE)
            .appendLiteral('T')
            .append(DateTimeFormatter.ISO_LOCAL_TIME)
            .optionalStart()
            .appendOffsetId()
            .optionalEnd()
            .toFormatter();

    private static final DateTimeFormatter customFormatter = new DateTimeFormatterBuilder()
            .append(DateTimeFormatter.ISO_LOCAL_DATE)
            .appendLiteral('T')
            .append(DateTimeFormatter.ISO_LOCAL_TIME)
            .appendLiteral('Z') // 添加字面值 'Z' 表示时区偏移量
            .toFormatter();

    /**
     * 将UTC时间转换为指定时区的时间，格式保持ISO-8601 默认时区为东八区
     * @param utcTimeString UTC时间字符串（ISO-8601格式）
     * @return 指定时区的时间字符串（ISO-8601格式）
     */
    public static String convertUtcToLocal(String utcTimeString) {
        String zoneIdString="Asia/Shanghai";
        return convertUtcToLocal(utcTimeString,zoneIdString);
    }

    /**
     * 将UTC时间转换为指定时区的时间，格式保持ISO-8601
     * @param utcTimeString UTC时间字符串（ISO-8601格式）
     * @param zoneIdString 时区ID，如"Asia/Shanghai"
     * @return 指定时区的时间字符串（ISO-8601格式）
     */
    public static String convertUtcToLocal(String utcTimeString, String zoneIdString) {
        Instant utcTime = Instant.parse(utcTimeString);
        ZonedDateTime localTime = utcTime.atZone(ZoneId.of(zoneIdString));
        DateTimeFormatter formatter = customFormatter.withZone(ZoneId.of(zoneIdString));
        return formatter.format(localTime);
    }

    /**
     * 将本地时间转换为UTC时间
     * @param localTimeString 本地时间字符串（ISO-8601格式）
     * @return UTC时间字符串（ISO-8601格式）
     */
    public static String convertLocalToUtc(String localTimeString) {
        String zoneIdString="Asia/Shanghai";
        return convertLocalToUtc(localTimeString,zoneIdString);
    }
    /**
     * 将本地时间转换为UTC时间
     * @param localTimeString 本地时间字符串（ISO-8601格式）
     * @param zoneIdString 时区ID，如"Asia/Shanghai"
     * @return UTC时间字符串（ISO-8601格式）
     */
    public static String convertLocalToUtc(String localTimeString, String zoneIdString) {
        ZonedDateTime localTime = ZonedDateTime.parse(localTimeString, customFormatter.withZone(ZoneId.of(zoneIdString)));
        Instant utcTime = localTime.toInstant();
        return isoFormatter.format(utcTime.atZone(ZoneId.of("UTC")));
    }

    // 测试主方法
    /* public static void main(String[] args) {
        String utcTime = "2024-05-07T04:20:00Z";
        System.out.println("原UTC时间: " + utcTime);
        System.out.println("转换为北京时间: " + convertUtcToLocal(utcTime));

        String shanghaiTime = "2024-05-20T20:20:00Z";
        System.out.println("从北京时间转换回UTC时间: " + convertLocalToUtc(shanghaiTime));
    } */
}
